# # -*- coding: UTF8 -*-
##数据库配置文件

from sqlalchemy import create_engine  # 引擎
from sqlalchemy.orm import sessionmaker  # 创建orm的会话池，orm和sql均可以管理对象关系型数据库，需要绑定引擎才可以使用会话，
from sqlalchemy.pool import SingletonThreadPool  # 单线程池
# import pymysql
# 创建连接
# engine = create_engine("mysql+pymysql://root:12345678@localhost:3306/database",
#                        # 需要安装mysql和pymysql的模块，用户名:密码@ip地址/某个数据库
#                        # echo=True,         # 打印操作对应的SQL语句
#                        pool_size=8,  # 连接个数
#                        pool_recycle=60 * 30  # 不使用时断开
#                        )

engine = create_engine('sqlite:///myencode.db',
                       poolclass=SingletonThreadPool,
                       connect_args={'check_same_thread': False})


# 创建session
DbSession = sessionmaker(bind=engine)  # 会话工厂，与引擎绑定。
session = DbSession()  # 实例化

session.close()  # 关闭会话

# 导入定义类需要的模块
from sqlalchemy.ext.declarative import declarative_base  # 调用sqlalchemy的基类
from sqlalchemy import Column  # 指定字段属性，索引、唯一、DML
from sqlalchemy.types import *  # 所有字段类型

# 创建库表类型
Base = declarative_base()  # 调用sqlalchemy的基类


#---------------------------------------以上是数据库基础配置文件-------------------------------------------------#

class Persons(Base):
    '''继承基类'''
    __tablename__ = "ENCODE"  # 数据表的名字
    __table_args__ = {'extend_existing': True}  # 当数据库中已经有该表时，或内存中已声明该表，可以用此语句重新覆盖声明。
    id = Column(Integer, primary_key=True)
    Part_Name = Column(String(64))#单位工程
    Sub_ENCODE=Column(String(64))
    Part_ENCODE= Column(String(64))
    Finally_Part_ENCODE=Column(String(64))

    def __repr__(self):
        return "Persons(Part_Name='{self.Part_Name}', " \
               "Sub_ENCODE={self.Sub_ENCODE}, " \
               "Part_ENCODE={self.Part_ENCODE})".format(self=self)
 
    

Base.metadata.create_all(engine)  # 表生效：将所有定义的类，使用引擎创建，此时可以在数据库中看到这些表。


#增加数据（一个）
def add_encode(tuple):
    Part_Name,Sub_ENCODE,Part_ENCODE,Finally_Part_ENCODE=tuple
    Persons1=Persons(Part_Name=Part_Name,Sub_ENCODE=Sub_ENCODE,Part_ENCODE=Part_ENCODE,Finally_Part_ENCODE=Finally_Part_ENCODE)
    try:
        session.add(Persons1)
        print('成功插入')
        session.commit()
    except Exception as e:
        session.rollback()  # 执行失败则回滚插入操作
        print(e)

#删除数据

def inquire_encode(part_name,Second_Encode):


        if session.query(Persons.Sub_ENCODE).filter(Persons.Part_Name==part_name,Persons.Sub_ENCODE==Second_Encode).all():
            decode=session.query(Persons.Finally_Part_ENCODE).filter(Persons.Part_Name==part_name,Persons.Sub_ENCODE==Second_Encode).first()[0]
            return decode

            #获取二级编码下的三级编号有哪些
        else:
            try:
                r1=session.query(Persons.Part_ENCODE).filter(Persons.Sub_ENCODE==Second_Encode).all()
                numer=len(r1)+1
                if len(str(numer))==1:
                    endoce=f'00{numer}'
                elif len(str(numer))==2:
                    endoce=f'0{numer}'
                else:
                    endoce=f'{numer}'
                dir_encode=Second_Encode+endoce

                add_encode([part_name,Second_Encode,endoce,dir_encode])

                return dir_encode
            except:
                print('第一次成功插入')
                add_encode([part_name,Second_Encode,'001'])

            

if __name__=='__main__':
    pass

    
   
